package ch3.LoadBalanceModule;

import sun.misc.Request;

/**
 * 负载均衡模块中，负责调用下游部件服务的类
 */

public class ServiceInvoker {
    // 保存该类的唯一实例
    private static final ServiceInvoker INSTANCE = new ServiceInvoker();
    // 负载均衡器实例，使用volatile保障可见性
    private volatile LoadBalancer loadBalancer;

    private ServiceInvoker() {

    }

    // 获取当前类的唯一实例
    public static ServiceInvoker getInstance() {
        return INSTANCE;
    }

    /**
     * 根据指定的负载均衡器派发请求到特定的下游部件
     */
    public void dispatchRequest(Request request) {
       // 读取volatile变量loadBalancer
        Endpoint endpoint = getLoadBalancer().nextEndpoint();

        if (null == endpoint) {
            return;
        }

        // 将请求下发给下游部件
        dispatchToDownStream(request, endpoint);
    }

    // 将指定的请求派发给下游部件
    private void dispatchToDownStream(Request request, Endpoint endpoint) {
    }

    public LoadBalancer getLoadBalancer() {
        return loadBalancer;
    }

    // 设置或更新负载均衡器实例
    public void setLoadBalancer(LoadBalancer loadBalancer) {
        this.loadBalancer = loadBalancer;
    }
}
